package com.gadgets.framework.common.fileload;

import com.gadgets.framework.common.dto.CacheRedisDTO;
import com.gadgets.framework.common.dto.WoodenGeneratorCommandDTO;
import com.gadgets.framework.common.util.Dom4jUtil;
import com.gadgets.framework.common.util.RedisUtil;
import com.gadgets.framework.common.util.StringUtils;
import com.gadgets.framework.fileload.AbstractFileScanLoad;
import com.gadgets.framework.task.WoodenGeneratorTask;
import org.dom4j.Document;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * 功能说明：fm04.xml文件扫描
 *
 * @author Unclexiu
 * @version V202101.00.000
 * @data 2022-07-19
 * 修改记录：  修改日期          修改人员    修改说明
 * 2022-07-19  xiujunqing   创建文件
 */
@Component
public class WoodenFileLoad extends AbstractFileScanLoad {

	protected final Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private WoodenGeneratorTask task;
	@Autowired
	private RedisUtil redisUtil;

	public WoodenFileLoad() {
		super(".fm04.xml");
	}


	/**
	 * 分析文件（压缩文件）
	 *
	 * @param targetFile 目标文件
	 * @param entry      文件内容
	 */
	@Override
	public void analysisFile(ZipFile targetFile, ZipEntry entry) {
		try {
			InputStream inputStream = targetFile.getInputStream(entry);
			Document document = Dom4jUtil.readDomByStream(inputStream);
			analysisDom(document);
		} catch (Throwable e) {
			logger.error("打开文件{}!{}的读取流失败，失败原因{}",targetFile.getName(),entry.getName(),e.getMessage());
			logger.error(StringUtils.formatExceptionStack(e));
		}

	}

	private void analysisDom(Document document) {
		// 获取<woodens>对象
		Element root = document.getRootElement();
		if(null!=root){
			List<Element> list = root.elements();
			if(null!=list){
				// 遍历解析<moduel>
				for (Element moduelEle : list) {
					String key = moduelEle.attributeValue("key");
					String stepSize = moduelEle.attributeValue("step_size", "50");
					String maxSize = moduelEle.attributeValue("max_size", "2000");
					String order = moduelEle.attributeValue("order", "9999");
					if(StringUtils.isBlank(key)){
						logger.error("当前<moduel>标签的 key 属性为空或不存在，跳过注册");
					}
					WoodenGeneratorCommandDTO commandDTO = new WoodenGeneratorCommandDTO();
					commandDTO.setModuelNo(key);
					commandDTO.setNum(Integer.parseInt(stepSize));
					commandDTO.setMaxNum(Long.parseLong(maxSize));
					commandDTO.setOrder(Integer.parseInt(order));
					task.addWoodenCommandInfo(commandDTO);
					redisUtil.setNxStringCacheKey(new CacheRedisDTO<>(key, "0"));
					logger.info("初始化令牌Key：{}完成", key);
				}
			}
		}
	}

	/**
	 * 分析文件（非压缩文件）
	 *
	 * @param file 目标文件
	 */
	@Override
	public void analysisFile(File file) {
		try {
			Document document = Dom4jUtil.readDomByFile(file);
			analysisDom(document);
		} catch (Throwable e) {
			logger.error("打开文件{}的读取流失败，失败原因{}",file.getPath(),e.getMessage());
			logger.error(StringUtils.formatExceptionStack(e));
		}
	}

	/**
	 * 最终文件处理
	 */
	@Override
	public void analysisFinally() {

	}

}
